package com.zy;

import dev.langchain4j.community.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
import dev.langchain4j.store.embedding.EmbeddingSearchResult;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;

/**
 * @program: AI_langchain4j
 * @description: 将向量化后的数据存入向量库
 * @author: zy
 * @create: 2025-07-05 16:34
 */
public class RAG_App2 {

    public static void main(String[] args) {
        /////////////////////阶段一: 向量化+向量数据库
        //1。向量模型
        QwenEmbeddingModel qwenEmbeddingModel = QwenEmbeddingModel.builder()
                .apiKey(System.getenv("ALI_AI_KEY"))
                .build();
        //2.向量数据库: clickhouse, es,      milvus, pgvector, chromadb, pinecone, weaviate
        InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore();

        //3.利用向量模型进行向量化，然后存储向量到向量数据库.
        TextSegment textSegment = TextSegment.from("""
                预订钻戒:
                -通过我们的网站或APP预订,您可以轻松拥有一个个性化的钻戒,以表达您的情感和想法.
                -预订时需要全额付款.3天内包退换
                -确保个人信息(姓名，身份证号,手机号等)的准确性，因为更正可能会产生额外10元的费用.""");
        Embedding embedding1 = qwenEmbeddingModel.embed(textSegment).content();
        embeddingStore.add(embedding1, textSegment);

        TextSegment segments2 = TextSegment.from("""
                取消预订:
                - 最晚取消时间为发货前24小时前.
                - 取消费用: 普通钻戒 20元/件, 钻石钻戒 30元/件.
                - 退款将在7个工作日内处理
                """);
        Embedding embedding2 = qwenEmbeddingModel.embed(segments2).content();
        embeddingStore.add(embedding2, segments2);


        /////////////////阶段二: 匹配向量
        Embedding queryEmbedding= qwenEmbeddingModel.embed( "退订需要手续费吗?").content();
        //创建请求
        EmbeddingSearchRequest build=EmbeddingSearchRequest.builder()
                .queryEmbedding(queryEmbedding)
                .maxResults( 2 )      //返回最相似的前2条数据
                .minScore(  0.7 )
                .build();
        //开始搜索
        EmbeddingSearchResult< TextSegment> result=embeddingStore.search( build );
        //输出结果
        result.matches().forEach(  embeddingMatch->{
            System.out.println( embeddingMatch.score() +"\t"+embeddingMatch.embedded().text() );
        });

    }
}
